<!DOCTYPE html>



  


<html class="theme-next gemini use-motion" lang="zh-Hans">
<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="theme-color" content="#222">
<meta name="google-site-verification" content="4b5ChOPlfrWPkfJKVSwbnGC4WDT5fyOTDO62HVBosls">
<meta name="baidu-site-verification" content="iotYLCUzXs">









<meta http-equiv="Cache-Control" content="no-transform">
<meta http-equiv="Cache-Control" content="no-siteapp">
















  
  
  <link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css">







<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css">

<link href="/css/main.css?v=5.1.4" rel="stylesheet" type="text/css">


  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=5.1.4">


  <link rel="mask-icon" href="/images/logo.svg?v=5.1.4" color="#222">





  <meta name="keywords" content="无人驾驶 Apollo,">





  <link rel="alternate" href="/atom.xml" title="songjiapo" type="application/atom+xml">






<meta name="description" content="感知在本课中 我们将首先介绍计算机视觉的基本应用领域，然后我们将介绍机器学习、神经网络和卷积神经网络的基础知识。 我们将继续讨论感知模块在无人驾驶车中的具体任务，接下来将介绍 Apollo 感知模块的体系结构和传感器融合的相关主题。希望这会让你对无人驾驶感知系统有一个清晰认识 计算机视觉作为人类 你和我可以自动识别图像中的物体，甚至可以推断这些物体之间的关系。但是 对于计算机而言，图像只是红色、绿">
<meta name="keywords" content="无人驾驶 Apollo">
<meta property="og:type" content="article">
<meta property="og:title" content="无人驾驶第一课-Lesson 4：感知">
<meta property="og:url" content="https://songjiapo.com/Self-Driving Car Fundamentals-Featuring Apollo/2018-07-18-Self-Driving Car Fundamentals-Featuring Apollo-lesson 4-Perception.html">
<meta property="og:site_name" content="songjiapo">
<meta property="og:description" content="感知在本课中 我们将首先介绍计算机视觉的基本应用领域，然后我们将介绍机器学习、神经网络和卷积神经网络的基础知识。 我们将继续讨论感知模块在无人驾驶车中的具体任务，接下来将介绍 Apollo 感知模块的体系结构和传感器融合的相关主题。希望这会让你对无人驾驶感知系统有一个清晰认识 计算机视觉作为人类 你和我可以自动识别图像中的物体，甚至可以推断这些物体之间的关系。但是 对于计算机而言，图像只是红色、绿">
<meta property="og:locale" content="zh-Hans">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/perception.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/classification%20steps.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/%E5%9B%BE%E5%83%8F%E7%9F%A9%E9%98%B5.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/RGB%E5%9B%BE.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/lidar%E5%9B%BE%E5%83%8F.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%BB%83%E4%B9%A0%E9%A2%98.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/how%20know%20a%20car.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/backpropagation.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/%E4%B8%80%E7%BB%B4.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/cnn.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/%E5%88%86%E7%B1%BB.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/fully%20CN.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/detection%20network.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/YOLO.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/camera%20radar%20lidar%20compare.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/radar%20lidar.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/two%20step%20estimation%20problem.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/fusion%20fuse.jpg">
<meta property="og:updated_time" content="2019-11-08T12:50:25.582Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="无人驾驶第一课-Lesson 4：感知">
<meta name="twitter:description" content="感知在本课中 我们将首先介绍计算机视觉的基本应用领域，然后我们将介绍机器学习、神经网络和卷积神经网络的基础知识。 我们将继续讨论感知模块在无人驾驶车中的具体任务，接下来将介绍 Apollo 感知模块的体系结构和传感器融合的相关主题。希望这会让你对无人驾驶感知系统有一个清晰认识 计算机视觉作为人类 你和我可以自动识别图像中的物体，甚至可以推断这些物体之间的关系。但是 对于计算机而言，图像只是红色、绿">
<meta name="twitter:image" content="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/perception.jpg">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Gemini',
    version: '5.1.4',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":true,"scrollpercent":true,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    duoshuo: {
      userId: '0',
      author: '博主'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="https://songjiapo.com/Self-Driving Car Fundamentals-Featuring Apollo/2018-07-18-Self-Driving Car Fundamentals-Featuring Apollo-lesson 4-Perception.html">





  <title>无人驾驶第一课-Lesson 4：感知 | songjiapo</title>
  





  <script type="text/javascript">
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "https://hm.baidu.com/hm.js?e07193cab6deb965ead8e1aed3d4744f";
      var s = document.getElementsByTagName("script")[0];
      s.parentNode.insertBefore(hm, s);
    })();
  </script>




</head>

<body itemscope="" itemtype="http://schema.org/WebPage" lang="zh-Hans">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail">
    <div class="headband"></div>

    <header id="header" class="header" itemscope="" itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">songjiapo</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <h1 class="site-subtitle" itemprop="description"></h1>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br>
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/tags/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br>
            
            标签
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br>
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br>
            
            归档
          </a>
        </li>
      

      
        <li class="menu-item menu-item-search">
          
            <a href="javascript:;" class="popup-trigger">
          
            
              <i class="menu-item-icon fa fa-search fa-fw"></i> <br>
            
            搜索
          </a>
        </li>
      
    </ul>
  

  
    <div class="site-search">
      
  <div class="popup search-popup local-search-popup">
  <div class="local-search-header clearfix">
    <span class="search-icon">
      <i class="fa fa-search"></i>
    </span>
    <span class="popup-btn-close">
      <i class="fa fa-times-circle"></i>
    </span>
    <div class="local-search-input-wrapper">
      <input autocomplete="off" placeholder="搜索..." spellcheck="false" type="text" id="local-search-input">
    </div>
  </div>
  <div id="local-search-result"></div>
</div>



    </div>
  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal" itemscope="" itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="https://songjiapo.com/Self-Driving Car Fundamentals-Featuring Apollo/2018-07-18-Self-Driving Car Fundamentals-Featuring Apollo-lesson 4-Perception.html">

    <span hidden itemprop="author" itemscope="" itemtype="http://schema.org/Person">
      <meta itemprop="name" content="song jiapo">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope="" itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="songjiapo">
    </span>

    
      <header class="post-header">

        
        
          <h2 class="post-title" itemprop="name headline">无人驾驶第一课-Lesson 4：感知</h2>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2018-07-18T21:08:31+08:00">
                2018-07-18
              </time>
            

            

            
          </span>

          
            <span class="post-category">
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope="" itemtype="http://schema.org/Thing">
                  <a href="/categories/self-driving/" itemprop="url" rel="index">
                    <span itemprop="name">self-driving</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <span class="post-meta-item-icon">
                  <i class="fa fa-comment-o"></i>
                </span>
                <a href="/Self-Driving Car Fundamentals-Featuring Apollo/2018-07-18-Self-Driving Car Fundamentals-Featuring Apollo-lesson 4-Perception.html#comments" itemprop="discussionUrl">
                  <span class="post-comments-count valine-comment-count" data-xid="/Self-Driving Car Fundamentals-Featuring Apollo/2018-07-18-Self-Driving Car Fundamentals-Featuring Apollo-lesson 4-Perception.html" itemprop="commentCount"></span>
                </a>
              </span>
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <h1 id="感知"><a href="#感知" class="headerlink" title="感知"></a>感知</h1><p>在本课中 我们将首先介绍计算机视觉的基本应用领域，然后我们将介绍机器学习、神经网络和卷积神经网络的基础知识。</p>
<p>我们将继续讨论感知模块在无人驾驶车中的具体任务，接下来将介绍 Apollo 感知模块的体系结构和传感器融合的相关主题。希望这会让你对无人驾驶感知系统有一个清晰认识</p>
<h2 id="计算机视觉"><a href="#计算机视觉" class="headerlink" title="计算机视觉"></a>计算机视觉</h2><p>作为人类 你和我可以自动识别图像中的物体，甚至可以推断这些物体之间的关系。但是 对于计算机而言，图像只是红色、绿色和蓝色值的集合。如何将这些颜色值翻译为解读有意义的图像内容并不明显。</p>
<p><strong>无人驾驶车有四个感知世界的核心任务</strong>。</p>
<ul>
<li><p>检测 是指找出物体在环境中的位置</p>
</li>
<li><p>分类 是指明确对象是什么</p>
</li>
<li><p>跟踪 是指随时间的推移观察移动物体。如其他车辆、自行车和行人</p>
</li>
<li>语义分割意味着将图像中的每个像素与语义类别进行匹配。如道路、汽车或天空</li>
</ul>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/perception.jpg" alt=""></p>
<p>我们可将 <strong>分类</strong> 作为作为研究计算机视觉一般数据流程的例子。</p>
<p><strong>图像分类器是一种将图像作为输入并输出标识该图像的标签或“类别”的算法</strong>。例如 交通标志分类器查看停车标志并识别它是停车标志、让路标志、限速标志，还是其他类型的标志。分类器甚至可以识别行为。比如一个人是在走路 还是在跑步。</p>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/classification%20steps.jpg" alt=""></p>
<p>分类器有很多种，但它们都包含一系列类似的步骤。</p>
<ul>
<li>首先 计算机接收类似摄像头等成像设备的输入，这通常被捕获为图像或一系列图像。</li>
<li>然后通过预处理发送每个图像预处理对每个图像进行了标准化处理。常见的预处理步骤包括调整图像大小或旋转图像或将图像从一个色彩空间转换为另一个色彩空间。例如从全彩到灰度。预处理可帮助我们的模型更快地处理和学习图像。</li>
<li>接下来 提取特征。特征有助于计算机理解图像。例如 将汽车与自行车区分开来的一些特征，汽车通常具有更大的形状 并且它有四个轮子而不是两个，形状和车轮将是汽车的显著特征。我们将在本课的后面详细讨论特征。</li>
<li>最后 这些特征被输入到分类模型中，此步骤使用特征来选择图像类别。例如 分类器可以确定图像是否包含汽车、自行车、行人或者根本不包含这样的对象。为了完成这些视觉任务，需要建立模型。模型是帮助计算机了解图像内容的工具，在计算机视觉中 无论经过训练的模型执行什么任务，它们通常在开始时将摄像头图像作为输入。</li>
</ul>
<h2 id="摄像头图像"><a href="#摄像头图像" class="headerlink" title="摄像头图像"></a>摄像头图像</h2><p>摄像头图像是最常见的计算机视觉数据。</p>
<p>以这张汽车照片为例，让我们看看计算机如何认为这实际上是一辆汽车的图像。</p>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/%E5%9B%BE%E5%83%8F%E7%9F%A9%E9%98%B5.jpg" alt=""></p>
<p> <strong>从计算机的角度来看，图像只是一个二维网格，也被称为矩阵</strong>。矩阵中的每个单元格都包含一个值，数字图像全部由像素组成，其中包含非常小的颜色或强度单位。</p>
<p>图像中的每个像素都只是一个数值，这些值构成了我们的图像矩阵。我们甚至可以改变这些像素值。我们可以通过为每个像素值添加一个标量整数来改变图像亮度，我们也可以向右移动每个像素值，我们还可以执行许多其他操作。通常 这些数字网格是许多图像处理技术的基础。多数颜色和形状转换都只是通过对图像进行数学运算以及逐一像素进行更改来完成。现在是一个将图像分解为二维灰度像素值网格的示例。</p>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/RGB%E5%9B%BE.jpg" alt=""></p>
<p>彩色图像是相似的 但更复杂一点，彩色图像被构建为值的三维立方体。每个立方体都有高度、宽度和深度，深度为颜色通道数量。大多数彩色图像以三种颜色组合表示，红色、绿色和蓝色，这些图像被称为 <strong>RGB 图像</strong>。对于 RGB 图像 深度为 3！因此 RGB 图像可以用一个薄盒子表示，将深度视为三重叠加的二维色层很有帮助。一层为红色，一层为绿色、一层为蓝色，它们一起构建了一个完整的彩色图像。</p>
<h2 id="LiDAR-图像"><a href="#LiDAR-图像" class="headerlink" title="LiDAR 图像"></a>LiDAR 图像</h2><p>激光雷达传感器创建环境的点云表征，提供了难以通过摄像头图像获得的信息，如距离和高度。</p>
<p>激光雷达传感器使用光线 ，尤其是激光 来测量与环境中反射该光线的物体之间的距离。激光雷达发射激光脉冲并测量物体将每个激光脉冲反射回传感器所花费的时间。反射需要的时间越长 物体离传感器越远，激光雷达正是通过这种方式来构建世界的视觉表征。</p>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/lidar%E5%9B%BE%E5%83%8F.jpg" alt=""></p>
<p>你可以在此可视化视图中看到激光雷达的输出，激光雷达通过发射光脉冲来检测汽车周围的环境。蓝色点表示反射激光脉冲的物体，中间的黑色区域是无人驾驶车本身占据的空间。由于激光雷达测量激光束反射，它收集的数据形成一团点或 <strong>“点云”</strong>。</p>
<p>点云中的每个点代表反射回传感器的激光束，这些点云可以告诉我们关于物体的许多信息，例如其形状和表面纹理。通过对点进行聚类和分析，这些数据提供了足够的对象检测、跟踪或分类信息，在这里你可以看到在点云上执行的检测和分类结果。红点为行人 绿点表示其他汽车，正如你所看到的那样 激光雷达数据提供了用于构建世界视觉表征的足够空间信息。</p>
<p>计算机视觉技术不仅可以使用摄像头图像进行对象分类，还可以使用点云和其他类型的空间相关数据进行对象分类。</p>
<h2 id="机器学习"><a href="#机器学习" class="headerlink" title="机器学习"></a>机器学习</h2><p>机器学习是使用特殊算法来训练计算机从数据中学习的计算机科学领域。通常 这种学习结果存放在一种被称为“模型”的数据结构中。有很多种模型，事实上 “模型”只是一种可用于理解和预测世界的数据结构。</p>
<ul>
<li><p>机器学习涉及使用数据和相关的真值标记来进行模型训练。例如 可能会显示车辆和行人的计算机图像，以及告诉计算机哪个是哪个的标签，我会让计算机学习如何最好地区分两类图像，这类机器学习也称为 <strong>监督式学习</strong>，因为模型利用了人类创造的真值标记</p>
</li>
<li><p>你可以设想一个类似的学习过程，但这次使用的是没有真值标记的车辆与行人图像。在这种方法中 我们会让计算机自行决定，哪些图像相似 哪些图像不同，这被称为 <strong>无监督学习</strong>。我们在这不提供真值标记，而是通过分析输入的数据，计算机凭借自行学习找到区别。</p>
</li>
<li><p>另一种方法被称为 <strong>“半监督式”学习</strong>。它将监督学习和无监督学习的特点结合在一起，该方法使用少量的标记数据和大量的未标记数据来训练模型。</p>
</li>
<li><p><strong>强化学习</strong>  是另一种机器学习，强化学习涉及允许模型通过尝试许多不同的方法来解决问题，然后衡量哪种方法最为成功。计算机将尝试许多不同的解决方案，最终使其方法与环境相适应。</p>
</li>
</ul>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%BB%83%E4%B9%A0%E9%A2%98.jpg" alt=""></p>
<p>例如 在模拟器中，强化学习智能体可训练汽车进行右转，智能体将在初始位置发动车辆，然后进行实验性驾驶，以多种不同的方向和速度。如果汽车实际完成了右转，智能体会提高奖励，即得分，这是针对导致成功结果的初始操作。起初 汽车可能无法找到执行转弯的方法，然而 就像人类那样，汽车最终会从一些成功的右转经验中学习，最后学会如何完成任务。</p>
<h2 id="神经网络"><a href="#神经网络" class="headerlink" title="神经网络"></a>神经网络</h2><p>人工神经网络是通过数据来学习复杂模式的工具。神经网络由大量的神经元组成，正如人体神经系统的神经元那样，人工神经元负责传递和处理信息，也可以对这些神经元进行训练。</p>
<p>你可以将一些图像识别为车辆 无论它们是黑是白或大或小，你甚至可能不知道自己如何知道它们是车辆，也许是某些特征触发了你的反应，如车轮、车灯和车窗。</p>
<p>人工神经网络具有相似的运作方式，通过密集训练 计算机可以辨别汽车、行人、交通信号灯和电线杆。</p>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/how%20know%20a%20car.jpg" alt=""></p>
<p>当看到该图像时，你的大脑如何工作？你的大脑可能会将图像分为几部分，然后识别特征，如车轮、车窗和颜色 然后 大脑将使用这些特征对图像进行检测和分类。例如 在确定图像是否为汽车时，大脑可能不会认为颜色是关键特征 因为汽车有多种颜色，所以大脑会将更多权重放在其他特征上 并降低颜色的重要性。</p>
<p>同样地 <strong>神经网络也会从图像中提取许多特征</strong>但这些特征可能是我们人类无法描述或甚至无法理解的特征，但我们最终并不需要理解，计算机将 <strong>调整这些特征的权重</strong>以完成神经网络的最终任务，这就是深层神经网络的思维方式。</p>
<h2 id="反向传播算法"><a href="#反向传播算法" class="headerlink" title="反向传播算法"></a>反向传播算法</h2><p>我们已经讨论过神经网络如何从数据中“学习”,那么你可能想知道这种学习如何发生。</p>
<p><strong>学习有时称为训练，它由三步循环组成：前馈、误差测定和反向传播</strong>。</p>
<ul>
<li>首先随机分配初始权重，即人工神经元的值。通过神经网络来馈送每个图像 产生输出值，这被称为前馈。</li>
</ul>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/backpropagation.jpg" alt=""></p>
<ul>
<li>下一步为误差测定，误差是真值标记与与前馈过程所产生输出之间的偏差。</li>
<li>最后一步是反向传播，通过神经网络反向发送误差此过程类似前馈过程 只是以相反方向进行。</li>
</ul>
<p>每个人工神经元都对其值进行微调，这是基于通过神经网络后向传播的误差。所有这些独立调整的结果 可生成更准确的网络 。</p>
<p>一个训练周期： 包括前馈、误差测定和反向传播还远远不够，为了训练网络 通常需要数千个这样的周期。但最终结果应该是：模型能够根据新数据做出准确预测。</p>
<h2 id="卷积神经网络"><a href="#卷积神经网络" class="headerlink" title="卷积神经网络"></a>卷积神经网络</h2><p>卷积神经网络 （CNN） 是 一种人工神经网络， 它对感知问题特别有效。CNN 接受多维输入，包括定义大多数传感器数据的二维和三维形状。</p>
<p>如果使用标准神经网络对图像进行分类，则需要通过一种方法将图像连接到网络的第一层，这属于一维。标准做法是通过将图像矩阵重塑为一个矢量，并在一个大行中连接所有列 将图像“展开”为一维像素阵列 。</p>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/%E4%B8%80%E7%BB%B4.jpg" alt=""></p>
<p>然而 这种方法打破了图像中所嵌入的空间信息，如果图像中有车轮，则车轮中的所有像素将散布在整个像素阵列中。但我们知道 这些像素，以二维方式连接形成车轮。如果我们将其散布在一个维度上，神经网络很难从图像中提取车轮。</p>
<p>CNN 通过维持输入像素之间的空间关系来解决这个问题。具体来说 CNN 通过将过滤器连续滑过图像来收集信息，每次收集信息时，只对整个图像的一小部分区域进行分析，这被称为 “<strong>卷积</strong>”。</p>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/cnn.jpg" alt=""><br>当我们在整个输入图像上对一个过滤器进行“卷积”时，我们将该信息与下一个卷积层相关联。例如 CNN 可以识别第一个卷积层中的基本边缘和颜色信息，然后 通过在第一层上卷积新过滤器，CNN 可以使用边缘和颜色信息，来归纳更复杂的结构 如车轮、车门和挡风玻璃。而另一个卷积可使用车轮、车门和挡风玻璃识别整个车辆。最后 神经网络可使用这一高阶信息对车辆进行分类。</p>
<p>人们通常不太清楚 CNN 如何解读图像，CNN 有时会侧重于图像中令人惊讶的部分，但这也是深度学习的神奇之处。<strong>CNN 根据其任务查找真正需要的特征，任务可能是图像检测、分类、分割或其他类型的目标</strong>。</p>
<h2 id="检测与分类"><a href="#检测与分类" class="headerlink" title="检测与分类"></a>检测与分类</h2><p>在感知任务中,首先想到的是<strong>障碍物检测和分类</strong>。</p>
<p>在驾驶过程中会遇到许多障碍物，静态障碍物包括墙壁、树木、杆子和建筑物。动态障碍物包括行人、自行车和各种汽车。</p>
<p><strong>计算机首先需要知道这些障碍物的位置，然后对它们进行分类</strong>。在路中行驶的无人驾驶车可能会探测到许多不同的物体，汽车根据所感知的物体类型，来确定路径和速度。如果感知到前方有一辆自行车，汽车可能会决定减速和变道 以便安全驶过自行车。但是 如果感知到前方有另一辆车，并预测到前方车辆也将以接近限速的速度行驶。无人驾驶车可能会保持其速度和车道。</p>
<p>另一个示例为 <strong>交通信号灯检测分类</strong>。首先 我们将使用计算机视觉对图像中的交通信号灯进行定位。然后 我们可以根据灯光显示颜色对交通信号灯进行分类。</p>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/%E5%88%86%E7%B1%BB.jpg" alt=""></p>
<p>在无人驾驶车辆中，我们使用什么算法来对障碍物进行检测和分类？我们可以先使用检测 CNN 来查找图像中的对象的位置，在对图像中的对象进行定位后，我们可以将图像发送给另一个 CNN 进行分类。</p>
<p>我们也可以使用单一 CNN 体系结构对对象进行检测和分类。一种通常的做法为在单个网络体系结构的末端附加几个不同的“头”，一个头可能执行检测，另一个则可能执行分类。</p>
<p>一个经典的体系结构为 R-CNN 及其变体 Fast R-CNN 和 Faster R-CNN、YOLO 和 SSD 是具有类似形式的不同体系结构。</p>
<h2 id="tracking跟踪"><a href="#tracking跟踪" class="headerlink" title="tracking跟踪"></a>tracking跟踪</h2><p>在检测完对象后 我们需要追踪它们。</p>
<p>追踪的意义是什么？如果我们对每个帧中的每个对象进行检测并用边界框对每个对象进行标识。</p>
<p>那么跨帧追踪对象会带来哪些好处？首先 追踪在检测失败时是至关重要的。如果你在运行检测算法时，对象被其他对象遮挡一部分，则检测算法可能会失败。追踪可以解决遮挡问题。另一个原因在于追踪可以保留身份。障碍物检测的输出为包含对象的边界框，但是 对象没有与任何身份关联，单独使用对象检测时，计算机不知道一个帧中的哪些对象与下一帧中的哪些对象相对应。</p>
<p>该任务对人类来说很简单 但对汽车来说很困难。追踪的第一步为确认身份，通过查找特征相似度最高的对象，我们将在之前的帧中检测到的所有对象与在当前的帧中检测到的对象进行匹配。对象具有各种特征，有些特征可能基于颜色 而另一些特征可能基于形状，计算机视觉算法可以计算出复杂的图像特征，如局部二值模式和方向梯度直方图。当然 我们也需要考虑连续视频帧中，两个障碍物之间的位置和速度。<strong>由于两个帧之间的对象位置和速度没有太大变化，该信息也可以帮助我们快速找到匹配的对象</strong>。在确定身份后 我们可以使用对象的位置，并结合预测算法以估计在下一个时间步的速度和位置，该预测可帮助我们识别下一帧中的相应对象。</p>
<h2 id="segmentation-语义分割"><a href="#segmentation-语义分割" class="headerlink" title="segmentation 语义分割"></a>segmentation 语义分割</h2><p>语义分割涉及对图像的每个像素进行分类。它用于尽可能详细地了解环境，并确定车辆可驾驶区域。</p>
<p>语义分割依赖于一种特殊类型的 CNN，它被称为全卷积网络 或 FCN。FCN 用卷积层来替代传统 CNN 体系结构末端的平坦层。现在 网络中的每一层都是卷积层，因此其名称为“全卷积网络”。</p>
<p>FCN 提供了可在原始输入图像之上叠加的逐像素输出，我们必须考虑的一个复杂因素是大小。在典型的 CNN 中 经过多次卷积之后，所产生的输出比原始输入图像小得多。</p>
<p>然而 为了分割像素，输出尺寸必须与原始图像的尺寸相匹配，为了达到该目的 我们可以对中间输出进行上采样处理，直到最终输出的大小与原始输出图像的大小相匹配，网络的前半部分通常被称为编码器。因为这部分网络对输入图像的特征进行了提取和编码，网络的后半部分通常被称为解码器，因为它对这些特征进行了解码 并将其应用于输出。</p>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/fully%20CN.jpg" alt=""></p>
<h2 id="Apollo-感知"><a href="#Apollo-感知" class="headerlink" title="Apollo 感知"></a>Apollo 感知</h2><p>Apollo 开放式软件栈可感知障碍物、交通信号灯和车道。对于三维对象检测，Apollo 在高精度地图上使用 感兴趣区域 (ROI)来重点关注相关对象。</p>
<p>Apollo 将 ROI 过滤器应用于点云和图像数据，以缩小搜索范围并加快感知。然后 通过检测网络馈送已过滤的点云，输出用于构建围绕对象的三维边界框，最后 我们使用被称为 <strong>检测跟踪关联</strong> 的算法来跨时间步识别单个对象。</p>
<p>该算法先保留在每个时间步要跟踪的对象列表，然后在下一个时间步中找到每个对象的最佳匹配。对于交通信号灯的分类,Apollo 先使用高精度地图来确定前方是否存在交通信号灯,如果前方有交通信号灯,则高精度地图会返回灯的位置,这侧重于摄像头搜索范围,在摄像头捕获到交通信号灯图像后,Apollo 使用检测网络对图像中的灯进行定位,然后 Apollo 从较大的图像中提取交通信号灯。Apollo 将裁剪的交通灯图像提供给分类网络，以确定灯颜色。如果有许多灯，则系统需要选择哪些灯与其车道相关。</p>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/detection%20network.jpg" alt=""></p>
<p>Apollo 使用 <strong>YOLO 网络</strong>，来检测车道线和动态物体。 其中包括车辆、卡车、骑自行车的人和行人，在经过 YOLO 网络检测后，在线检测模块会并入来自其他传感器的数据，对车道线预测进行调整，车道线最终被并入名为“虚拟车道”的单一数据结构中。同样 也通过其他传感器的数据对 YOLO 网络所检测到的动态对象进行调整以获得每个对象的类型、位置、速度和前进方向。虚拟通道和动态对象均被传递到规划与控制模块。</p>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/YOLO.jpg" alt=""></p>
<h2 id="传感器数据比较"><a href="#传感器数据比较" class="headerlink" title="传感器数据比较"></a>传感器数据比较</h2><p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/camera%20radar%20lidar%20compare.jpg" alt=""></p>
<p><strong>感知通常依赖于摄像头、激光雷达和雷达</strong>。该图显示了这三种传感器的优缺点，绿色代表性能良好，黄色代表混合性能，红色代表性能不佳。</p>
<ul>
<li>摄像头非常适用于分类，在 Apollo 中 摄像头主要用于交通信号灯分类 以及车道检测。</li>
<li>激光雷达的优势在于障碍物检测，即使在夜间 在没有自然光的情况下，激光雷达仍能准确地检测障碍物。</li>
<li>雷达在探测范围和应对恶劣天气方面占优势</li>
</ul>
<p>通过融合这三种传感器的数据，可实现最佳聚合性能，这被称为“传感器融合”</p>
<h3 id="雷达与激光雷达"><a href="#雷达与激光雷达" class="headerlink" title="雷达与激光雷达"></a>雷达与激光雷达</h3><p>雷达已经在汽车上使用很多年，在各种系统中都需要雷达，如自适应巡航控制、盲点警告、碰撞浸膏和碰撞预防系统等。尽管雷达技术已经成熟，它仍在不断进步，作用不断提升。其他传感器测量速度的方法是计算两次读数之间的差距，而雷达则通过多普勒效应来直接测量速度。多普勒效应根据对象在远离还是接近你，测量出雷达的频率变化。就像消防车警报器一样，当车辆正在远离你和驶向你时，听起来声是不一样的。多普勒效应对传感器融合至关重要。因为它可以把速度作为独立的测量参数，从而提升了融合算法的收敛速度。雷达还可以生成环境的雷达地图，进而实现定位。因为雷达波在坚硬表面会回弹。因此，它可以直接测量对象距离，无需在视线范围内也可以。雷达可以看到其他车辆底部。并发现可能会被阻挡的建筑物和对象。在车上的所有传感器中，雷达是至不容易受雨雾影响的。而且视野宽阔，可达 150 度，距离可达200 多米。与激光雷达和摄像头相比，雷达分辨率较低，尤其是在垂直方向，分辨率非常有限。分辨率低意味着来自静态物体的反射可能产生问题。例如，街道上检修孔盖或汽水罐，可能产生很高的雷达反射率，但他们并不大。我们将其称为雷达杂波。因此，当前的车载雷达通常会忽视静态物体。</p>
<p>激光雷达是激光探测与测量的简称，而雷达则谁无线电探测与测量的简称。雷达使用无线电波，而激光雷达则使用红激光束来确定传感器和附近对象的距离。目前的激光雷达大多使用 900 纳米光波长度的光源。但部分激光雷达使用的光波长度更长，在雨雾中性能更好。当前的激光雷达使用旋转座架发射激光，扫描周边环境。激光室脉冲式的，脉冲被对象反射，然后返回一个点云，来代表这些物体。激光雷达的空间分辨率远远高于雷达。因为激光束越聚焦，垂直方向的扫描层数量就越多，因此每层的激光雷达的密度也越高。目前，激光雷达还不能直接测量对象的速度，必须使用两次或多次扫描之间的位置差来确定。激光雷达受天气和传感器清洁程度影响也很大，因此需要保持清洁。它们块头也比其他传感器更大，因此也很难安装，除非你只想在车顶安装一个大的激光扫描器。</p>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/radar%20lidar.jpg" alt=""></p>
<h2 id="感知融合策略"><a href="#感知融合策略" class="headerlink" title="感知融合策略"></a>感知融合策略</h2><p>Apollo 使用激光雷达和雷达来检测障碍物。用于融合输出的主要算法为卡尔曼滤波。</p>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/two%20step%20estimation%20problem.jpg" alt=""></p>
<p>卡尔曼滤波有两个步骤。第一步为预测状态，第二步是更新测量结果。</p>
<p>设想我们正在跟踪一名行人，这里的状态表示行人的位置和速度，从已经掌握的行人状态开始。我们使用这些信息来执行卡尔曼滤波的第一步，即预测行人在将来的状态。</p>
<p>下一步为误差结果更新，我们使用新的传感器来更新我们所认为的行人状态，卡尔曼滤波算法是预测和更新步骤的无限循环。</p>
<p><img src="https://raw.githubusercontent.com/songapore/For-PicGo/master/img/fusion%20fuse.jpg" alt=""></p>
<p>实际上有两种测量结果更新步骤：同步和异步。同步融合同时更新来自不同传感器的测量结果，而异步融合则逐个更新所收到的传感器测量结果。传感器融合可提高感知性能 因为各传感器相辅相成，融合也可以减少跟踪误差，所以我们可以更加确信，对道路上其他物体位置的预测。</p>

      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/tags/无人驾驶-Apollo/" rel="tag"># 无人驾驶 Apollo</a>
          
        </div>
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/Self-Driving Car Fundamentals-Featuring Apollo/2018-07-14-Self-Driving Car Fundamentals-Featuring Apollo-lesson 3-Location.html" rel="next" title="无人驾驶第一课-Lesson 3：定位">
                <i class="fa fa-chevron-left"></i> 无人驾驶第一课-Lesson 3：定位
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/uds/udsoncan.html" rel="prev" title="udsoncan-underlying protocol(connections)">
                udsoncan-underlying protocol(connections) <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          

  
    <div class="comments" id="comments">
    </div>
  



        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview-wrap">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview-wrap sidebar-panel">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope="" itemtype="http://schema.org/Person">
            
              <p class="site-author-name" itemprop="name">song jiapo</p>
              <p class="site-description motion-element" itemprop="description"></p>
          </div>

          <nav class="site-state motion-element">

            
              <div class="site-state-item site-state-posts">
              
                <a href="/archives/">
              
                  <span class="site-state-item-count">57</span>
                  <span class="site-state-item-name">日志</span>
                </a>
              </div>
            

            
              
              
              <div class="site-state-item site-state-categories">
                <a href="/categories/index.html">
                  <span class="site-state-item-count">7</span>
                  <span class="site-state-item-name">分类</span>
                </a>
              </div>
            

            
              
              
              <div class="site-state-item site-state-tags">
                <a href="/tags/index.html">
                  <span class="site-state-item-count">15</span>
                  <span class="site-state-item-name">标签</span>
                </a>
              </div>
            

          </nav>

          
            <div class="feed-link motion-element">
              <a href="/atom.xml" rel="alternate">
                <i class="fa fa-rss"></i>
                RSS
              </a>
            </div>
          

          
            <div class="links-of-author motion-element">
                
                  <span class="links-of-author-item">
                    <a href="https://github.com/songapore" target="_blank" title="GitHub">
                      
                        <i class="fa fa-fw fa-github"></i>GitHub</a>
                  </span>
                
                  <span class="links-of-author-item">
                    <a href="mailto:291946540@qq.com" target="_blank" title="E-Mail">
                      
                        <i class="fa fa-fw fa-envelope"></i>E-Mail</a>
                  </span>
                
            </div>
          

          
          

          
          

          

        </div>
      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#感知"><span class="nav-number">1.</span> <span class="nav-text">感知</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#计算机视觉"><span class="nav-number">1.1.</span> <span class="nav-text">计算机视觉</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#摄像头图像"><span class="nav-number">1.2.</span> <span class="nav-text">摄像头图像</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#LiDAR-图像"><span class="nav-number">1.3.</span> <span class="nav-text">LiDAR 图像</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#机器学习"><span class="nav-number">1.4.</span> <span class="nav-text">机器学习</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#神经网络"><span class="nav-number">1.5.</span> <span class="nav-text">神经网络</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#反向传播算法"><span class="nav-number">1.6.</span> <span class="nav-text">反向传播算法</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#卷积神经网络"><span class="nav-number">1.7.</span> <span class="nav-text">卷积神经网络</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#检测与分类"><span class="nav-number">1.8.</span> <span class="nav-text">检测与分类</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#tracking跟踪"><span class="nav-number">1.9.</span> <span class="nav-text">tracking跟踪</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#segmentation-语义分割"><span class="nav-number">1.10.</span> <span class="nav-text">segmentation 语义分割</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Apollo-感知"><span class="nav-number">1.11.</span> <span class="nav-text">Apollo 感知</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#传感器数据比较"><span class="nav-number">1.12.</span> <span class="nav-text">传感器数据比较</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#雷达与激光雷达"><span class="nav-number">1.12.1.</span> <span class="nav-text">雷达与激光雷达</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#感知融合策略"><span class="nav-number">1.13.</span> <span class="nav-text">感知融合策略</span></a></li></ol></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      
        <div class="back-to-top">
          <i class="fa fa-arrow-up"></i>
          
            <span id="scrollpercent"><span>0</span>%</span>
          
        </div>
      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright">&copy; 2018 &mdash; <span itemprop="copyrightYear">2020</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">song jiapo</span>

  
</div>









        







        
      </div>
    </footer>

    

    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  


  











  
  
    <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>
  

  
  
    <script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>
  

  
  
    <script type="text/javascript" src="/lib/canvas-nest/canvas-nest.min.js"></script>
  


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.1.4"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.1.4"></script>



  
  


  <script type="text/javascript" src="/js/src/affix.js?v=5.1.4"></script>

  <script type="text/javascript" src="/js/src/schemes/pisces.js?v=5.1.4"></script>



  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.1.4"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.1.4"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.4"></script>



  


  




	





  





  










  <script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
  <script src="//unpkg.com/valine/dist/Valine.min.js"></script>
  
  <script type="text/javascript">
    var GUEST = ['nick','mail','link'];
    var guest = 'nick,mail,link';
    guest = guest.split(',').filter(item=>{
      return GUEST.indexOf(item)>-1;
    });
    new Valine({
        el: '#comments' ,
        verify: false,
        notify: false,
        appId: 'l1gitUPNjT1yErmRT7fmIUb3-gzGzoHsz',
        appKey: 'cJ2gj9m4cWlnD3Yw8VBXz3pw',
        placeholder: 'Just go go',
        avatar:'mm',
        guest_info:guest,
        pageSize:'10' || 10,
    });
  </script>



  

  <script type="text/javascript">
    // Popup Window;
    var isfetched = false;
    var isXml = true;
    // Search DB path;
    var search_path = "search.xml";
    if (search_path.length === 0) {
      search_path = "search.xml";
    } else if (/json$/i.test(search_path)) {
      isXml = false;
    }
    var path = "/" + search_path;
    // monitor main search box;

    var onPopupClose = function (e) {
      $('.popup').hide();
      $('#local-search-input').val('');
      $('.search-result-list').remove();
      $('#no-result').remove();
      $(".local-search-pop-overlay").remove();
      $('body').css('overflow', '');
    }

    function proceedsearch() {
      $("body")
        .append('<div class="search-popup-overlay local-search-pop-overlay"></div>')
        .css('overflow', 'hidden');
      $('.search-popup-overlay').click(onPopupClose);
      $('.popup').toggle();
      var $localSearchInput = $('#local-search-input');
      $localSearchInput.attr("autocapitalize", "none");
      $localSearchInput.attr("autocorrect", "off");
      $localSearchInput.focus();
    }

    // search function;
    var searchFunc = function(path, search_id, content_id) {
      'use strict';

      // start loading animation
      $("body")
        .append('<div class="search-popup-overlay local-search-pop-overlay">' +
          '<div id="search-loading-icon">' +
          '<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>' +
          '</div>' +
          '</div>')
        .css('overflow', 'hidden');
      $("#search-loading-icon").css('margin', '20% auto 0 auto').css('text-align', 'center');

      $.ajax({
        url: path,
        dataType: isXml ? "xml" : "json",
        async: true,
        success: function(res) {
          // get the contents from search data
          isfetched = true;
          $('.popup').detach().appendTo('.header-inner');
          var datas = isXml ? $("entry", res).map(function() {
            return {
              title: $("title", this).text(),
              content: $("content",this).text(),
              url: $("url" , this).text()
            };
          }).get() : res;
          var input = document.getElementById(search_id);
          var resultContent = document.getElementById(content_id);
          var inputEventFunction = function() {
            var searchText = input.value.trim().toLowerCase();
            var keywords = searchText.split(/[\s\-]+/);
            if (keywords.length > 1) {
              keywords.push(searchText);
            }
            var resultItems = [];
            if (searchText.length > 0) {
              // perform local searching
              datas.forEach(function(data) {
                var isMatch = false;
                var hitCount = 0;
                var searchTextCount = 0;
                var title = data.title.trim();
                var titleInLowerCase = title.toLowerCase();
                var content = data.content.trim().replace(/<[^>]+>/g,"");
                var contentInLowerCase = content.toLowerCase();
                var articleUrl = decodeURIComponent(data.url);
                var indexOfTitle = [];
                var indexOfContent = [];
                // only match articles with not empty titles
                if(title != '') {
                  keywords.forEach(function(keyword) {
                    function getIndexByWord(word, text, caseSensitive) {
                      var wordLen = word.length;
                      if (wordLen === 0) {
                        return [];
                      }
                      var startPosition = 0, position = [], index = [];
                      if (!caseSensitive) {
                        text = text.toLowerCase();
                        word = word.toLowerCase();
                      }
                      while ((position = text.indexOf(word, startPosition)) > -1) {
                        index.push({position: position, word: word});
                        startPosition = position + wordLen;
                      }
                      return index;
                    }

                    indexOfTitle = indexOfTitle.concat(getIndexByWord(keyword, titleInLowerCase, false));
                    indexOfContent = indexOfContent.concat(getIndexByWord(keyword, contentInLowerCase, false));
                  });
                  if (indexOfTitle.length > 0 || indexOfContent.length > 0) {
                    isMatch = true;
                    hitCount = indexOfTitle.length + indexOfContent.length;
                  }
                }

                // show search results

                if (isMatch) {
                  // sort index by position of keyword

                  [indexOfTitle, indexOfContent].forEach(function (index) {
                    index.sort(function (itemLeft, itemRight) {
                      if (itemRight.position !== itemLeft.position) {
                        return itemRight.position - itemLeft.position;
                      } else {
                        return itemLeft.word.length - itemRight.word.length;
                      }
                    });
                  });

                  // merge hits into slices

                  function mergeIntoSlice(text, start, end, index) {
                    var item = index[index.length - 1];
                    var position = item.position;
                    var word = item.word;
                    var hits = [];
                    var searchTextCountInSlice = 0;
                    while (position + word.length <= end && index.length != 0) {
                      if (word === searchText) {
                        searchTextCountInSlice++;
                      }
                      hits.push({position: position, length: word.length});
                      var wordEnd = position + word.length;

                      // move to next position of hit

                      index.pop();
                      while (index.length != 0) {
                        item = index[index.length - 1];
                        position = item.position;
                        word = item.word;
                        if (wordEnd > position) {
                          index.pop();
                        } else {
                          break;
                        }
                      }
                    }
                    searchTextCount += searchTextCountInSlice;
                    return {
                      hits: hits,
                      start: start,
                      end: end,
                      searchTextCount: searchTextCountInSlice
                    };
                  }

                  var slicesOfTitle = [];
                  if (indexOfTitle.length != 0) {
                    slicesOfTitle.push(mergeIntoSlice(title, 0, title.length, indexOfTitle));
                  }

                  var slicesOfContent = [];
                  while (indexOfContent.length != 0) {
                    var item = indexOfContent[indexOfContent.length - 1];
                    var position = item.position;
                    var word = item.word;
                    // cut out 100 characters
                    var start = position - 20;
                    var end = position + 80;
                    if(start < 0){
                      start = 0;
                    }
                    if (end < position + word.length) {
                      end = position + word.length;
                    }
                    if(end > content.length){
                      end = content.length;
                    }
                    slicesOfContent.push(mergeIntoSlice(content, start, end, indexOfContent));
                  }

                  // sort slices in content by search text's count and hits' count

                  slicesOfContent.sort(function (sliceLeft, sliceRight) {
                    if (sliceLeft.searchTextCount !== sliceRight.searchTextCount) {
                      return sliceRight.searchTextCount - sliceLeft.searchTextCount;
                    } else if (sliceLeft.hits.length !== sliceRight.hits.length) {
                      return sliceRight.hits.length - sliceLeft.hits.length;
                    } else {
                      return sliceLeft.start - sliceRight.start;
                    }
                  });

                  // select top N slices in content

                  var upperBound = parseInt('1');
                  if (upperBound >= 0) {
                    slicesOfContent = slicesOfContent.slice(0, upperBound);
                  }

                  // highlight title and content

                  function highlightKeyword(text, slice) {
                    var result = '';
                    var prevEnd = slice.start;
                    slice.hits.forEach(function (hit) {
                      result += text.substring(prevEnd, hit.position);
                      var end = hit.position + hit.length;
                      result += '<b class="search-keyword">' + text.substring(hit.position, end) + '</b>';
                      prevEnd = end;
                    });
                    result += text.substring(prevEnd, slice.end);
                    return result;
                  }

                  var resultItem = '';

                  if (slicesOfTitle.length != 0) {
                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + highlightKeyword(title, slicesOfTitle[0]) + "</a>";
                  } else {
                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + title + "</a>";
                  }

                  slicesOfContent.forEach(function (slice) {
                    resultItem += "<a href='" + articleUrl + "'>" +
                      "<p class=\"search-result\">" + highlightKeyword(content, slice) +
                      "...</p>" + "</a>";
                  });

                  resultItem += "</li>";
                  resultItems.push({
                    item: resultItem,
                    searchTextCount: searchTextCount,
                    hitCount: hitCount,
                    id: resultItems.length
                  });
                }
              })
            };
            if (keywords.length === 1 && keywords[0] === "") {
              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-search fa-5x" /></div>'
            } else if (resultItems.length === 0) {
              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-frown-o fa-5x" /></div>'
            } else {
              resultItems.sort(function (resultLeft, resultRight) {
                if (resultLeft.searchTextCount !== resultRight.searchTextCount) {
                  return resultRight.searchTextCount - resultLeft.searchTextCount;
                } else if (resultLeft.hitCount !== resultRight.hitCount) {
                  return resultRight.hitCount - resultLeft.hitCount;
                } else {
                  return resultRight.id - resultLeft.id;
                }
              });
              var searchResultList = '<ul class=\"search-result-list\">';
              resultItems.forEach(function (result) {
                searchResultList += result.item;
              })
              searchResultList += "</ul>";
              resultContent.innerHTML = searchResultList;
            }
          }

          if ('auto' === 'auto') {
            input.addEventListener('input', inputEventFunction);
          } else {
            $('.search-icon').click(inputEventFunction);
            input.addEventListener('keypress', function (event) {
              if (event.keyCode === 13) {
                inputEventFunction();
              }
            });
          }

          // remove loading animation
          $(".local-search-pop-overlay").remove();
          $('body').css('overflow', '');

          proceedsearch();
        }
      });
    }

    // handle and trigger popup window;
    $('.popup-trigger').click(function(e) {
      e.stopPropagation();
      if (isfetched === false) {
        searchFunc(path, 'local-search-input', 'local-search-result');
      } else {
        proceedsearch();
      };
    });

    $('.popup-btn-close').click(onPopupClose);
    $('.popup').click(function(e){
      e.stopPropagation();
    });
    $(document).on('keyup', function (event) {
      var shouldDismissSearchPopup = event.which === 27 &&
        $('.search-popup').is(':visible');
      if (shouldDismissSearchPopup) {
        onPopupClose();
      }
    });
  </script>





  

  

  
<script>
(function(){
    var bp = document.createElement('script');
    var curProtocol = window.location.protocol.split(':')[0];
    if (curProtocol === 'https') {
        bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';        
    }
    else {
        bp.src = 'http://push.zhanzhang.baidu.com/push.js';
    }
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(bp, s);
})();
</script>


  
  

  
  


  

  

</body>
</html>
